home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / MX.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  18KB  |  523 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   Mx.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   05-Oct-91
  7. *   Current version :   1.00
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   05-Oct-91     1.00            MX editor.
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data
  23.  */
  24. extern ULONG                Class;
  25. extern UWORD                Code;
  26. extern struct Gadget       *Object;
  27. extern APTR                 MainVisualInfo;
  28. extern struct TextAttr      Topaz80;
  29. extern struct Screen       *MainScreen;
  30. extern struct Window       *MainWindow;
  31. extern UWORD                ngFlags;
  32. extern WORD                 ngLeft, ngTop, ngWidth, ngHeight;
  33. extern struct ExtGadgetList Gadgets;
  34. extern struct MemoryChain  *Chain;
  35. extern BOOL                 Saved;
  36.  
  37. /*
  38.  * --- Gadget ID's
  39.  */
  40. #define GD_LABEL            0
  41. #define GD_UNDERSCORE       1
  42. #define GD_SPACING          2
  43. #define GD_LABELS           3
  44. #define GD_LABELENTRY       4
  45. #define GD_TEXTPLACE        5
  46. #define GD_REMOVE           6
  47. #define GD_OK               7
  48. #define GD_CANCEL           8
  49.  
  50. /*
  51.  * --- Module data
  52.  */
  53. struct Window              *mx_Wnd    = NULL;
  54. struct Gadget              *mx_GList  = NULL;
  55. struct Gadget              *mx_Gadgets[6];
  56. BOOL                        mx_UScore = FALSE;
  57. struct List                 mx_Labels;
  58. struct ListViewNode        *mx_Node = 0l;
  59. UWORD                       mx_NumLabels = 0;
  60. WORD                        mx_Zoom[4];
  61. UBYTE                      *PlaceL[] = {
  62.     "LEFT", "RIGHT", 0l };
  63. UWORD                       PlaceF[] = {
  64.     PLACETEXT_LEFT, PLACETEXT_RIGHT };
  65.  
  66. struct TagItem              mx_nwTags[] = {
  67.     WA_Left,                0l,
  68.     WA_Top,                 0l,
  69.     WA_Width,               0l,
  70.     WA_Height,              0l,
  71.     WA_IDCMP,               IDCMP_CLOSEWINDOW | CYCLEIDCMP | BUTTONIDCMP | CHECKBOXIDCMP | LISTVIEWIDCMP | IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY,
  72.     WA_Flags,               WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  73.     WA_Gadgets,             0l,
  74.     WA_Title,               "Edit MX gadget:",
  75.     WA_AutoAdjust,          TRUE,
  76.     WA_Zoom,                (Tag)mx_Zoom,
  77.     WA_CustomScreen,        0l,
  78.     TAG_DONE };
  79.  
  80. /*
  81.  * --- Create the mx gadget.
  82.  */
  83. long MakeMX( void )
  84. {
  85.     struct ExtNewGadget *eng  = 0l;
  86.     struct TagItem      *tags = 0l;
  87.  
  88.     if ( eng = AllocItem( Chain, (long)sizeof( struct ExtNewGadget ), MEMF_PUBLIC )) {
  89.         if ( tags = MakeTagList( 3l )) {
  90.  
  91.             eng->en_NumTags = 3l;
  92.             eng->en_Tags = tags;
  93.  
  94.             ChangeMX( eng );
  95.  
  96.             RemoveAllGadgets();
  97.  
  98.             AddTail(( struct List * )&Gadgets, ( struct Node * )eng );
  99.  
  100.             Renumber();
  101.  
  102.             if ( RemakeAllGadgets())
  103.                 return TRUE;
  104.  
  105.             Remove(( struct Node * )eng);
  106.         }
  107.     }
  108.  
  109.     MyRequest( "Ahem....", "CONTINUE", "Out of memory !" );
  110.  
  111.     if ( tags )         FreeTagList( tags, 3l );
  112.     if ( eng  )         FreeItem( Chain, eng, (long)sizeof( struct ExtNewGadget ));
  113.  
  114.     return FALSE;
  115. }
  116.  
  117. /*
  118.  * --- Change the mx gadget.
  119.  */
  120. void ChangeMX( struct ExtNewGadget *eng )
  121. {
  122.     struct TagItem      *tags;
  123.     UBYTE               *slab, tn = 0;
  124.     LONG                 num;
  125.  
  126.     tags = eng->en_Tags;
  127.  
  128.     slab = (( struct StringInfo * )mx_Gadgets[ GD_LABEL ]->SpecialInfo )->Buffer;
  129.  
  130.     eng->en_NewGadget.ng_LeftEdge   =   ngLeft;
  131.     eng->en_NewGadget.ng_TopEdge    =   ngTop;
  132.     eng->en_NewGadget.ng_Width      =   ngWidth;
  133.     eng->en_NewGadget.ng_Height     =   ngHeight;
  134.  
  135.     if ( strncmp( slab, "Gadget", 6 ) && strlen( slab )) {
  136.         strcpy( &eng->en_SourceLabel[0], slab );
  137.         eng->en_SpecialFlags |= EGF_USERLABEL;
  138.     } else
  139.         eng->en_SpecialFlags = 0l;
  140.  
  141.     eng->en_NewGadget.ng_Flags      = ngFlags;
  142.     eng->en_Kind                    = MX_KIND;
  143.  
  144.     tags[ tn   ].ti_Tag  = GTMX_Labels;
  145.     tags[ tn++ ].ti_Data = &eng->en_Labels[0];
  146.  
  147.     num = (( struct StringInfo * )mx_Gadgets[ GD_SPACING ]->SpecialInfo )->LongInt;
  148.  
  149.     if ( num > 1 ) {
  150.         tags[ tn   ].ti_Tag  = GTMX_Spacing;
  151.         tags[ tn++ ].ti_Data = num;
  152.         eng->en_Spacing      = num;
  153.     }
  154.  
  155.     if ( mx_UScore ) {
  156.         tags[ tn   ].ti_Tag  = GT_Underscore;
  157.         tags[ tn++ ].ti_Data ='_';
  158.     }
  159.  
  160.     tags[ tn ].ti_Tag = TAG_DONE;
  161.  
  162.     if ( NOT( mx_NumLabels = ListToLabels( &mx_Labels, eng )))
  163.         MyRequest( "Oh oh...", "CONTINUE", "Out of memory !" );
  164.  
  165.     Saved = FALSE;
  166. }
  167.  
  168. /*
  169.  * --- Open the Edit MX requester.
  170.  */
  171. long EditMX( WORD x, WORD y, WORD x1, WORD y1, struct Gadget *edit )
  172. {
  173.     struct Gadget       *g;
  174.     struct ExtNewGadget *e;
  175.     struct ListViewNode *a;
  176.     struct NewGadget     ng;
  177.     BOOL                 running = TRUE, ok = FALSE;
  178.     WORD                 l, t, w, h, btop, bleft, gw, gh;
  179.     UBYTE                *label = 0l, *slabel = 0l, gbuf[10];
  180.     UBYTE                *string;
  181.     Tag                  place = 0l;
  182.     LONG                 num;
  183.     UWORD                flag  = PLACETEXT_LEFT;
  184.     UWORD                space = 1, ID;
  185.  
  186.     mx_Node = 0l;
  187.  
  188.     if ( edit ) {
  189.         e = FindExtGad( edit );
  190.  
  191.         x  = e->en_NewGadget.ng_LeftEdge;
  192.         y  = e->en_NewGadget.ng_TopEdge;
  193.         gw = e->en_NewGadget.ng_Width;
  194.         gh = e->en_NewGadget.ng_Height;
  195.  
  196.         slabel = &e->en_SourceLabel[0];
  197.  
  198.         flag = e->en_NewGadget.ng_Flags;
  199.  
  200.         if ( flag & PLACETEXT_LEFT  ) place = 0l;
  201.         if ( flag & PLACETEXT_RIGHT ) place = 1l;
  202.  
  203.         if ( MyTagInArray( GTMX_Spacing, e->en_Tags ))
  204.             space  = e->en_Spacing;
  205.  
  206.         mx_UScore = MyTagInArray( GT_Underscore, e->en_Tags );
  207.  
  208.         if ( NOT LabelsToList( &mx_Labels, e ))
  209.             MyRequest( "Oh oh...", "CONTINUE", "Out of memory !" );
  210.  
  211.     } else {
  212.         if ( x > x1 ) { gw = x; x = x1; x1 = gw; }
  213.         if ( y > y1 ) { gh = y; y = y1; y1 = gh; }
  214.  
  215.         gw = x1 - x + 1;
  216.         gh = y1 - y + 1;
  217.  
  218.         NewList( &mx_Labels );
  219.  
  220.         mx_NumLabels = 0;
  221.     }
  222.  
  223.     btop  = MainScreen->WBorTop + 1 + MainScreen->RastPort.TxHeight;
  224.     bleft = MainScreen->WBorLeft;
  225.  
  226.     w = bleft + MainScreen->WBorRight  + 300;
  227.     h = btop  + MainScreen->WBorBottom + 147;
  228.     l = (( MainScreen->Width  >> 1 ) - ( w >> 1 ));
  229.     t = (( MainScreen->Height >> 1 ) - ( h >> 1 ));
  230.  
  231.     mx_Zoom[0] = 0;
  232.     mx_Zoom[1] = btop;
  233.     mx_Zoom[2] = 200;
  234.     mx_Zoom[3] = btop;
  235.  
  236.     mx_nwTags[0 ].ti_Data = l;
  237.     mx_nwTags[1 ].ti_Data = t;
  238.     mx_nwTags[2 ].ti_Data = w;
  239.     mx_nwTags[3 ].ti_Data = h;
  240.     mx_nwTags[10].ti_Data = (Tag)MainScreen;
  241.  
  242.     if ( g = CreateContext( &mx_GList ))  {
  243.  
  244.         ng.ng_LeftEdge      =   bleft + 56;
  245.         ng.ng_TopEdge       =   btop + 4;
  246.         ng.ng_Width         =   236;
  247.         ng.ng_Height        =   12;
  248.         ng.ng_GadgetText    =   "_Label";
  249.         ng.ng_TextAttr      =   &Topaz80;
  250.         ng.ng_GadgetID      =   GD_LABEL;
  251.         ng.ng_Flags         =   PLACETEXT_LEFT;
  252.         ng.ng_VisualInfo    =   MainVisualInfo;
  253.         ng.ng_UserData      =   0l;
  254.  
  255.         g = CreateGadget( STRING_KIND, g, &ng, GTST_String, (Tag)slabel, GTST_MaxChars, (Tag)GT_MAXLABEL + 1, GT_Underscore, (Tag)'_', TAG_DONE );
  256.  
  257.         SetStringGadget( g );
  258.  
  259.         mx_Gadgets[ GD_LABEL ] = g;
  260.  
  261.         ng.ng_LeftEdge      =   bleft + 96;
  262.         ng.ng_TopEdge       =   btop + 20;
  263.         ng.ng_GadgetText    =   "_Underscore";
  264.         ng.ng_GadgetID      =   GD_UNDERSCORE;
  265.  
  266.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GTCB_Checked, (Tag)mx_UScore, GT_Underscore, '_', TAG_DONE );
  267.  
  268.         mx_Gadgets[ GD_UNDERSCORE ] = g;
  269.  
  270.         ng.ng_LeftEdge      =   bleft + 96;
  271.         ng.ng_TopEdge       =   btop + 36;
  272.         ng.ng_Width         =   196;
  273.         ng.ng_Height        =   12;
  274.         ng.ng_GadgetText    =   "_Spacing   ";
  275.         ng.ng_GadgetID      =   GD_SPACING;
  276.  
  277.         g = CreateGadget( INTEGER_KIND, g, &ng, GTIN_Number, (Tag)space, GTIN_MaxChars, 5l, GT_Underscore, '_', TAG_DONE );
  278.  
  279.         SetStringGadget( g );
  280.  
  281.         mx_Gadgets[ GD_SPACING ] = g;
  282.  
  283.         ng.ng_TopEdge       =   btop + 80;
  284.         ng.ng_GadgetText    =   "L_abels    ";
  285.         ng.ng_GadgetID      =   GD_LABELENTRY;
  286.  
  287.         g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, 99l, GT_Underscore, '_', TAG_DONE );
  288.  
  289.         SetStringGadget( g );
  290.  
  291.         mx_Gadgets[ GD_LABELENTRY ] = g;
  292.  
  293.         ng.ng_TopEdge       =   btop + 52;
  294.         ng.ng_Height        =   40;
  295.         ng.ng_GadgetText    =   0l;
  296.         ng.ng_GadgetID      =   GD_LABELS;
  297.  
  298.         g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, &mx_Labels, GTLV_ShowSelected, mx_Gadgets[ GD_LABELENTRY ], TAG_DONE );
  299.  
  300.         mx_Gadgets[ GD_LABELS ] = g;
  301.  
  302.         ng.ng_LeftEdge      =   bleft + 8;
  303.         ng.ng_TopEdge       =   btop + 97;
  304.         ng.ng_Width         =   284;
  305.         ng.ng_Height        =   12;
  306.         ng.ng_GadgetText    =   "^ R_emove ^";
  307.         ng.ng_GadgetID      =   GD_REMOVE;
  308.         ng.ng_Flags         =   PLACETEXT_IN;
  309.  
  310.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  311.  
  312.         ng.ng_LeftEdge      =   bleft + 96;
  313.         ng.ng_TopEdge       =   btop + 113;
  314.         ng.ng_Width         =   196;
  315.         ng.ng_Height        =   13;
  316.         ng.ng_GadgetText    =   "Text _Place";
  317.         ng.ng_GadgetID      =   GD_TEXTPLACE;
  318.         ng.ng_Flags         =   PLACETEXT_LEFT;
  319.  
  320.         g = CreateGadget( CYCLE_KIND, g, &ng, GTCY_Labels, (Tag)&PlaceL[0], GTCY_Active, place, GT_Underscore, (Tag)'_', TAG_DONE );
  321.  
  322.         mx_Gadgets[ GD_TEXTPLACE ] = g;
  323.  
  324.         ng.ng_LeftEdge      =   bleft + 8;
  325.         ng.ng_TopEdge       =   btop + 130;
  326.         ng.ng_Width         =   90;
  327.         ng.ng_GadgetText    =   "_OK";
  328.         ng.ng_Flags         =   PLACETEXT_IN;
  329.         ng.ng_GadgetID      =   GD_OK;
  330.  
  331.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  332.  
  333.         ng.ng_LeftEdge      =   bleft + 202;
  334.         ng.ng_GadgetText    =   "_CANCEL";
  335.         ng.ng_GadgetID      =   GD_CANCEL;
  336.  
  337.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, (Tag)'_', TAG_DONE );
  338.  
  339.         if ( g ) {
  340.  
  341.             mx_nwTags[6].ti_Data = (Tag)mx_GList;
  342.  
  343.             if ( mx_Wnd = OpenWindowTagList( 0l, mx_nwTags )) {
  344.  
  345.                 mx_Zoom[0] = l;
  346.                 mx_Zoom[1] = t;
  347.                 mx_Zoom[2] = w;
  348.                 mx_Zoom[3] = h;
  349.  
  350.                 GT_RefreshWindow( mx_Wnd, 0l );
  351.  
  352.                 do {
  353.                     WaitPort( mx_Wnd->UserPort );
  354.  
  355.                     while ( ReadIMsg( mx_Wnd )) {
  356.  
  357.                         switch ( Class ) {
  358.  
  359.                             case    IDCMP_REFRESHWINDOW:
  360.                                 GT_BeginRefresh( mx_Wnd );
  361.                                 GT_EndRefresh( mx_Wnd, TRUE );
  362.                                 break;
  363.  
  364.                             case    IDCMP_CLOSEWINDOW:
  365.                                 running = FALSE;
  366.                                 break;
  367.  
  368.                             case    IDCMP_GADGETUP:
  369.                                 switch( Object->GadgetID ) {
  370.  
  371.                                     case    GD_UNDERSCORE:
  372.                                         FlipFlop( 0l, 0l, 0l, &mx_UScore );
  373.                                         break;
  374.  
  375.                                     case    GD_SPACING:
  376.                                         num = (( struct StringInfo * )mx_Gadgets[ GD_SPACING ]->SpecialInfo )->LongInt;
  377.  
  378.                                         if ( num < 1 ) {
  379.                                             DisplayBeep( MainScreen );
  380.                                             GT_SetGadgetAttrs( mx_Gadgets[ GD_SPACING ], mx_Wnd, 0l, GTIN_Number, 1l, TAG_DONE );
  381.                                         }
  382.                                         break;
  383.  
  384.                                     case    GD_LABELS:
  385.                                         mx_Node = FindNode( &mx_Labels, Code );
  386.                                         break;
  387.  
  388.                                     case    GD_LABELENTRY:
  389.                                         string = (( struct StringInfo * )mx_Gadgets[ GD_LABELENTRY ]->SpecialInfo )->Buffer;
  390.  
  391.                                         if ( mx_NumLabels < 24 ) {
  392.                                             if ( strlen( string )) {
  393.                                                 GT_SetGadgetAttrs( mx_Gadgets[ GD_LABELS ], mx_Wnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  394.  
  395.                                                 if ( mx_Node ) {
  396.                                                     if ( NOT mx_Node->ln_UserData[0] ) {
  397.                                                         strcpy( &mx_Node->ln_NameBytes[0], string );
  398.                                                         mx_Node = 0l;
  399.                                                         goto done;
  400.                                                     } else goto make;
  401.                                                 }
  402.                                                 make:
  403.                                                 if ( mx_Node = MakeNode( string )) {
  404.                                                     AddTail( &mx_Labels, ( struct Node * )mx_Node );
  405.                                                     mx_Node = 0l;
  406.                                                     mx_NumLabels++;
  407.                                                 } else
  408.                                                     MyRequest( "Oh oh...", "CONTINUE", "Out of memory !" );
  409.                                                 done:
  410.                                                 GT_SetGadgetAttrs( mx_Gadgets[ GD_LABELS ], mx_Wnd, 0l, GTLV_Labels, &mx_Labels, TAG_DONE );
  411.                                              }
  412.                                          } else
  413.                                             MyRequest( "What are you doing?", "OKIDOKI", "You already have the maximum\n number of labels entered !" );
  414.                                          break;
  415.  
  416.                                     case    GD_REMOVE:
  417.                                         remove:
  418.                                         if ( mx_Node ) {
  419.                                             GT_SetGadgetAttrs( mx_Gadgets[ GD_LABELS ], mx_Wnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  420.                                             Remove(( struct Node * )mx_Node );
  421.                                             FreeItem( Chain, mx_Node, (long)sizeof( struct ListViewNode ));
  422.                                             GT_SetGadgetAttrs( mx_Gadgets[ GD_LABELS ], mx_Wnd, 0l, GTLV_Labels, &mx_Labels, TAG_DONE );
  423.                                             mx_NumLabels--;
  424.                                         }
  425.                                         break;
  426.  
  427.                                     case    GD_TEXTPLACE:
  428.                                         if ( place++ == 1 )
  429.                                             place = 0;
  430.  
  431.                                         flag = PlaceF[ place ];
  432.                                         break;
  433.  
  434.                                     case    GD_OK:
  435.                                         Ok:
  436.                                         if ( NOT mx_Labels.lh_Head->ln_Succ->ln_Succ ) {
  437.                                             MyRequest( "Hey man...", "OK", "I need aleast TWO labels !" );
  438.                                             break;
  439.                                         }
  440.                                         ok = TRUE;
  441.  
  442.                                     case    GD_CANCEL:
  443.                                         Cancel:
  444.                                         running = FALSE;
  445.                                         break;
  446.                                 }
  447.                                 break;
  448.  
  449.                             case    IDCMP_VANILLAKEY:
  450.                                 switch( Code ) {
  451.  
  452.                                     case    'l':
  453.                                         ID = GD_LABEL;
  454.                                         goto Activate;
  455.  
  456.                                     case    'u':
  457.                                         FlipFlop( mx_Wnd, mx_Gadgets, GD_UNDERSCORE, &mx_UScore );
  458.                                         break;
  459.  
  460.                                     case    's':
  461.                                         ID = GD_SPACING;
  462.                                         goto Activate;
  463.  
  464.                                     case    'a':
  465.                                         ID = GD_LABELENTRY;
  466.                                         goto Activate;
  467.  
  468.                                     case    'e':
  469.                                         goto remove;
  470.  
  471.                                     case    'p':
  472.                                         if ( place++ == 1 )
  473.                                             place = 0;
  474.  
  475.                                         flag = PlaceF[ place ];
  476.                                         GT_SetGadgetAttrs( mx_Gadgets[ GD_TEXTPLACE ], mx_Wnd, 0l, GTCY_Active, place, TAG_DONE );
  477.                                         break;
  478.  
  479.                                     case    'o':
  480.                                         goto Ok;
  481.  
  482.                                     case    'c':
  483.                                         goto Cancel;
  484.                                 }
  485.                                 break;
  486.                                 Activate:
  487.                                 ActivateGadget( mx_Gadgets[ ID ], mx_Wnd, 0l );
  488.                                 break;
  489.                         }
  490.                     }
  491.                 } while ( running );
  492.             }
  493.         }
  494.     }
  495.  
  496.     if ( ok) {
  497.         ngFlags     =   flag;
  498.         ngLeft      =   x;
  499.         ngTop       =   y;
  500.         ngWidth     =   gw;
  501.         ngHeight    =   gh;
  502.         if ( NOT edit )
  503.             ok = MakeMX();
  504.         else {
  505.             RemoveAllGadgets();
  506.             ChangeMX( e );
  507.             Renumber();
  508.             ok = RemakeAllGadgets();
  509.         }
  510.     } else if ( NOT edit )
  511.         Box( x, y, x1, y1 );
  512.  
  513.     if ( mx_Wnd )           CloseWindow( mx_Wnd );
  514.     if ( mx_GList )         FreeGadgets( mx_GList );
  515.  
  516.     mx_Wnd     = 0l;
  517.     mx_GList   = 0l;
  518.  
  519.     ClearMsgPort( MainWindow->UserPort );
  520.  
  521.     return( ok );
  522. }
  523.